package com.cy.duosearch.langchain.agent;

import com.cy.duosearch.langchain.tool.ToolResult;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public abstract class ReactAgent extends Agent {


    /**
     * 思考阶段：代理分析当前状态并决定下一步行动
     * @return 如果决定执行工具调用返回 true，否则返回 false
     */
    public abstract boolean think();

    /**
     * 行动阶段：执行具体的工具调用
     * @return 返回工具执行的结果
     */
    public abstract ToolResult action();


    /**
     * 执行一个完整的 ReAct 步骤
     * 1. 首先进行思考（think）
     * 2. 然后执行行动（action）
     * 这种设计模式允许代理能够：
     * - 在行动前进行充分的思考
     * - 根据思考结果决定是否执行行动
     * - 通过行动结果来指导下一步的思考
     * @return 返回本次步骤的执行结果
     */
    public ToolResult step() {

        if (!think()) {
            log.info("思考阶段不进行任何工具调用，表示agent任务已经结束");
        }

        return action();
    }

}
